gpt4 book ai didi

javascript - 返回 promise 与返回 promise 中的未定义之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 05:03:45 24 4
gpt4 key购买 nike

我不确定我是否理解这两种常见情况之间的区别。

假设我们有这个:

user.save().then(function(val){
anotherPromise1(val);
}).then(function(val){
anotherPromise2(val);
}).catch(function(err){

});

对比:

user.save().then(function(val){
return anotherPromise1(val);
}).then(function(val){
return anotherPromise2(val);
}).catch(function(err){

});

我知道这会有所不同,但究竟有什么不同呢?

最佳答案

如果您没有从 then 回调中返回值,您实际上是在返回 undefined。下一个 then 回调将立即运行,并将 undefined 视为解析值。

如果您从 then 回调返回一个 promise,第二个 then 回调会等待那个 promise(间接地,但这并不重要),并且当那个promise 已解决,从该 promise 中获取解决方案值。

(这包含在 Promises/A+ spec 中的 then 规范中,但略有遗漏——它没有明确提及如果 onFulfilled 没有发生时应该发生什么返回任何东西,但在 JavaScript 中,调用函数总是 给你一个结果值;如果函数没有显式返回某些东西,undefined 就是调用它的结果。JavaScript没有像 C/C#/C++/Java 那样的 void 方法的概念。)

你可以在这个脚本中看到它live copy on Babel's REPL :

let start = Date.now();
function elapsed() {
let rv = String(Date.now() - start);
while (rv.length < 4) {
rv = "0" + rv;
}
return rv;
}
function anotherPromise(type, val) {
console.log(`${elapsed()}: anotherPromise[${type}] got ${val}`);
return new Promise(resolve => {
setTimeout(() => { resolve(val * 2); }, 1000);
});
}
function anotherPromise2(type, val) {
console.log(`${elapsed()}: anotherPromise2[${type}] got ${val}`);
return new Promise(resolve => {
setTimeout(() => { resolve(val * 3); }, 10);
});
}
let user = {
save: () => {
return new Promise(resolve => {
setTimeout(() => {
resolve(42);
}, 10);
});
}
}

// Without return
user.save().then(function(val){
anotherPromise("without", val);
}).then(function(val){
anotherPromise2("without", val);
}).then(function() {
console.log(`${elapsed()}: All done`);
}).catch(function(err){
});

user.save().then(function(val){
return anotherPromise("with", val);
}).then(function(val){
return anotherPromise2("with", val);
}).then(function() {
console.log(`${elapsed()}: All done`);
}).catch(function(err){
});

输出是(例如):

0015: anotherPromise[without] got 420017: anotherPromise2[without] got undefined0018: All done0020: anotherPromise[with] got 421021: anotherPromise2[with] got 841032: All done

注意没有返回值和返回值之间的区别:

  • 没有anotherPromise2 被立即调用(正如我们可以从耗时值中看到的那样)并收到undefined

  • WithanotherPromise2 等待 anotherPromise 的解析发生,然后收到 84 (anotherPromise 的解析值)

关于javascript - 返回 promise 与返回 promise 中的未定义之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com