【问题标题】:Equivelance between two different dynamic promise provider chains两个不同的动态承诺提供者链之间的等价性
【发布时间】:2018-07-16 15:12:35
【问题描述】:

我想知道这两个代码块是不是基本等价的:

const executePromises = function(listOfProviders){

    let p = Promise.resolve(null);

    for(let i = 0; i < listOfProviders.length; i++){
       p = p.then(v => listOfProviders[i]());
    }

   return p;

};

我相信上面基本上相当于:

const executePromises = async function(listOfProviders) {

    for(let i = 0; i < listOfProviders.length; i++){
       await listOfProviders[i]();
    }

};

有人发现有差异吗?

【问题讨论】:

  • 首先,您将返回一个解析为最后一个 listofProviders 函数调用结果的承诺。在第二个中,您等待所有listofProviders 承诺,但对结果不做任何事情。所以,不,它们不一样。
  • 另外pconst。您无法重新分配给它。
  • 实际上,(一旦改成let而不是constexecutePromises返回的promise就是最后一次调用listOfProviders[i]()返回的promise
  • @CertainPerformance 在第一个函数中(假设 const 是固定的)该函数返回 p,这是链中的最后一个承诺。
  • 使第二个代码相同...在循环前添加let p,然后是p = await listOfProviders[i]();,最后在循环后添加return p

标签: javascript node.js async-await es6-promise


【解决方案1】:

没有。它们不一样。即使您像 cmets 中指出的那样返回承诺。

区别:

  • async awaitfor-loop 一起使用时,应记住,只有在当前迭代中解决了等待的承诺时,for 循环才会进入下一次迭代。
  • 另一方面,当.then 用于for-loop 时,for-loop 不会等待承诺解决,然后再进行下一次迭代。

我已经调整了你的代码来证明这一点。观察 Line A 在每个代码 sn-p 中的不同时间点被调用。

Async awaitfor-loop 代码:

function createPromiseWhichResolveAfterOneSec(i) {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log("About to resolve promise with value:",i);//Line A
            resolve(i);
        },1000)
    })
}

const executePromises = async function(listOfProviders) {

    let p;
    let i;
    for(i = 0; i < listOfProviders.length; i++){
        console.log("before", i);
        p = await createPromiseWhichResolveAfterOneSec(i);
        console.log("after", i);
    }
    console.log(i);
    return p;

};


let listOfProviders = [1,2,3,4,5];
let promise = executePromises(listOfProviders);
promise.then(value => console.log("this is the final value of promise chain:",value)).catch(()=>{});

for-loop 中有then

function createPromiseWhichResolveAfterOneSec(i) {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log("About to resolve promise with value:",i);//Line A
            resolve(i);
        },1000)
    })
}


const executePromises = function(listOfProviders){

    let p = Promise.resolve(null);

    for(let i = 0; i < listOfProviders.length; i++){
        console.log("before", i);
        p = p.then(v => createPromiseWhichResolveAfterOneSec(i));
        console.log("after", i);
    }

    return p;

};

let listOfProviders = [1,2,3,4,5];
let promise = executePromises(listOfProviders);
promise.then(value => console.log("this is the final value of promise chain:",value)).catch(()=>{});

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多