Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于'Promise'和'then()`执行令_Javascript_Promise_Es6 Promise - Fatal编程技术网

Javascript 关于'Promise'和'then()`执行令

Javascript 关于'Promise'和'then()`执行令,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,假设我有一个这样的函数 const fn=()=>{ 返回工作() .then((finalResult)=>{//then 1 完成(最终结果); }); }; 恒功=()=>{ 返回承诺。解决(1) .然后(()=>{//然后2 返回进程1(); }).then((结果)=>{//then 3 返回过程2(结果); }); }; 我的问题是:finish将在process1和process2之后调用。具体来说,是然后1附加到承诺返回的承诺。解决(1)还是它附加到然后3然后每个都将等待其先前

假设我有一个这样的函数

const fn=()=>{
返回工作()
.then((finalResult)=>{//then 1
完成(最终结果);
});
};
恒功=()=>{
返回承诺。解决(1)
.然后(()=>{//然后2
返回进程1();
}).then((结果)=>{//then 3
返回过程2(结果);
});
};

我的问题是:
finish
将在
process1
process2
之后调用。具体来说,是
然后1
附加到
承诺返回的承诺。解决(1)
还是它附加到
然后3
然后每个
都将等待其先前的承诺,然后依次运行

如果前面的承诺返回一个值,则传递给回调的参数将是该值,或者如果它返回另一个承诺,则回调的参数将是该承诺返回的值

promise plus规范中规定:

如果/当承诺实现时,所有相应的oncompleted回调必须按照其对then的原始调用的顺序执行

可以保证
finish(finalResult)
将以
process2(result)
的结果运行(当然,除非有错误)


我发现,在抓住承诺的勇气方面,我非常有启发性

这首先是一个语法问题。你现在所做的相当于

const fn = () => {
    const promiseA = work();
    const promiseB = promiseA.then(finish); // then 1
    return promiseB;
};

const work = () => {
    const promiseC = Promise.resolve(1);
    const promiseD = promiseC.then(process1); // then 2
    const promiseE = promiseD.then(process2); // then 3
    return promiseE;
};
只是引入了一些额外的变量(我还简化了函数表达式)

现在我们可以清楚地看到,
work()
的结果就是它返回的结果,因此
promiseA===promiseE
。因此,是的,
finish
链接到“then3”调用的结果


知道
then
创建了一个新的承诺(用于回调的最终结果),而不是返回原始承诺,我们还可以得出结论
promiseE!==promiseC
,因此,
finish
没有链接到
承诺上。解决(1)

你的
然后1
实际上链接到
之后,然后3
这与承诺没有任何关系。
work
的返回值是“then3”调用的返回值。