【问题标题】:Promise in loop循环中的承诺
【发布时间】:2018-03-25 11:26:58
【问题描述】:
function reduce(functn, intialPromise) {
    var proceed = true;
    var promise = intialPromise;
    do {
        functn(promise).then(next => {
            proceed = next.proceed;
            promise = next.promise;
        });
    } while(proceed);
    return promise;
}

工作函数

let promiseFunction = (promise) => {
    let proceed = true;
    return promise.then(() => {

        // some processing in which proceed can become false

        let nextPromise = {};
        if(proceed){
            nextPromise.proceed = true;
            nextPromise.promise = next promise task;
        }
        else {
            nextPromise.proceed = false;
            nextPromise.promise = Promise.resolve(true);
        }
        return Promise.resolve(nextPromise);
    });
};

执行

reduce(promiseFunction, initialPromise).then(() => {
    return success;
});

这段代码不断循环。

这个想法是用链式承诺。承诺执行的数据很大,比如 1 GB。但是为承诺处理分配的内存很低 - 100 MB。因此,promise 必须链式运行 - 采用适合内存的小批量。

目前也与 ES6 代码相关联,尚未添加 polyfills/transpiling。因此期待 ES6 代码中的结果。

PS:不是 javascript 专家,请为错误道歉

【问题讨论】:

  • 你提供什么来代替initialPromise
  • 这是一个有效的承诺 - 假设它的 Promise.resolve(true)
  • then 在不执行调用中提供的处理程序的情况下返回一个承诺。这些将在一段时间后异步执行,如果并且何时调用了承诺 then 已解决。更改proceed 的代码是异步的,稍后执行,并且在循环执行时不会更改循环变量 - 所以它永远循环。尝试搜索“递归承诺函数”(SO 上有 543 个结果)

标签: javascript promise es6-promise


【解决方案1】:

问题是do-while 是同步的(如果我是对的)。 看看JavaScript ES6 promise for loop

async/await 应该可以工作

async function reduce(functn, intialPromise) {
    var proceed = true;
    var promise = intialPromise;
    do {
        const result = await functn(promise);
        proceed = result.proceed;
        promise = result.promise;
    } while(proceed);
    return promise;
}

【讨论】:

【解决方案2】:

快速浏览一下:

您绝不会将“proceed”设置为“false”,因此它会继续循环您的 do-while。

【讨论】:

  • proceed = next.proceed;可以设置
  • 可以的。但它可能不会——而且它没有被指定(或被认为与代码相关)。
  • 在评论正文// some processing in which proceed can become false中提到
猜你喜欢
  • 2021-12-15
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-10-11
  • 2019-01-23
相关资源
最近更新 更多