2017-01-09 77 views
0

比方说,我有这样的在`Promise`和`然后()`执行顺序

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


const work =() => { 
    return Promise.resolve(1) 
    .then(() => {    // then 2 
     return process1(); 
    }).then((result) => {  // then 3 
     return process2(result); 
    }); 
}; 

我的问题的功能是:我可以依靠的事实,finish将被调用后process1process2。具体而言,then 1附加到由Promise.resolve(1)返回的承诺,还是附加到由then 3返回的承诺。

+0

这与promise没有任何关系。 'work'的返回值是“then3”调用的返回值。 – Bergi

+0

你的'然后1'实际上是链接在'then 3'后 – charlietfl

回答

0

每个then将等待其前面的承诺,然后轮流运行。

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

的承诺加上规范的状态Section 2.2.6.1

如果/许被满足时,都各自onFulfilled回调必须在订单的他们发起调用,然后执行。

这是保证finish(finalResult)将与process2(result)结果运行(除非有一个错误,当然)。

我发现this article是在得到认真处理承诺的胆量非常受启发。

1

这首先是一个语法问题。你在做什么等于

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链接到Promise.resolve(1)