jjr*_*bit 7 javascript promise
为什么调用第二个函数.then(notPromise)仍然将参数传递给第三个函数.then(promiseC),即使notPromise()只是一个常规函数?
我认为只有promises可以与.then()一起使用,但不知何故它仍然可以正确执行(并传递参数).
promiseA()
.then(notPromise)
.then(promiseC);
function promiseA() {
return new Promise(function (resolve, reject) {
const string = "a";
resolve(string);
});
}
function notPromise(string) {
const nextString = "b"
const finalString = string + nextString;
return finalString;
}
function promiseC(string) {
return new Promise(function (resolve, reject) {
const nextString = "c";
const finalString = string + nextString;
alert(finalString);
resolve(finalString);
});
}
Run Code Online (Sandbox Code Playgroud)
then()方法返回一个Promise. 查看文档.
promise有一个处理程序方法.一旦Promise被完成或拒绝,将异步调用相应的处理函数.处理程序函数的行为遵循此处所述的一组特定规则.
我们一个接一个地回顾一下.这是我们将并排检查的代码.它没什么特别的,只是一连串的承诺回归价值.
let sequence = new Promise(function (resolve) {
console.log('Say 1')
resolve(1)
})
sequence
.then(() => {
console.log('Say 2')
return 2
})
.then(() => {
console.log('Say 3')
})
.then(() => {
console.log('Say 4')
return Promise.resolve(4)
})
.then(() => {
return new Promise(function (resolve) {
console.log('Say 5')
setTimeout(() => { resolve(5) }, 1000)
})
})
Run Code Online (Sandbox Code Playgroud)
- 返回一个值,然后返回的promise将以返回值作为其值来解析;
在代码中,这是Say 2
和您原来的问题.返回值时,then()
返回一个Promise ,使用返回的值解析该Promise.
- 不返回任何内容,然后返回的promise将以未定义的值解析;
与上述相同.
- 抛出一个错误,然后返回的promise被抛出错误作为其值被拒绝;
与上面相同,除了现在then()
返回一个被错误拒绝的Promise.
- 返回已经解析的promise,然后返回的promise将以promise的值作为其值来解析;
在代码中,这是Say 4
承诺已经解决的地方.所以现在then()
返回一个Promise,用值4解析.
- 返回一个已被拒绝的promise,然后返回的promise将被拒绝,并将该promise的值作为其值;
同上,但现在拒绝.
- 返回另一个待处理的promise对象,当时返回的promise的解析/拒绝将在处理程序返回的promise的解析/拒绝之后.此外,then返回的promise的值将与处理程序返回的promise的值相同.
在代码中,这是Say 5
.如果您返回尚未解决then()
的承诺,将返回承诺的结果,即5.
有一点需要注意的是,我最近实际学到的东西(@Bergi在评论中建议)是该then()
方法总是在链回调甚至开始执行之前构造并返回一个新的Promise.您传递的回调then()
只是告诉承诺应该解析/拒绝承诺的值/错误.
总而言之,这就是为什么then()
链接工作即使你没有专门返回一个新的Promise - 因为then()
方法总是在幕后构造一个新的承诺,并拒绝/解析你所返回的值.上述场景中最复杂的情况是当您在回调中返回Promise时,在这种情况下,您的回调承诺的结果将传递给then()
promise.