当前位置: 首页 > 面试题库 >

正确编写承诺循环的方式。

云鸿达
2023-03-14
问题内容

如何正确构造一个循环以确保以下的 promise调用 和链接的 logger.log(res) 通过迭代同步运行?

db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise





var Promise = require('bluebird');

var promiseWhile = function(condition, action) {
    var resolver = Promise.defer();

    var loop = function() {
        if (!condition()) return resolver.resolve();
        return Promise.cast(action())
            .then(loop)
            .catch(resolver.reject);
    };

    process.nextTick(loop);

    return resolver.promise;
});

var count = 0;
promiseWhile(function() {
    return count < 10;
}, function() {
    return new Promise(function(resolve, reject) {
        db.getUser(email)
          .then(function(res) { 
              logger.log(res); 
              count++;
              resolve();
          });
    }); 
}).then(function() {
    console.log('all done');
});

尽管它似乎有效,但是我认为它不能保证调用 logger.log(res); 的顺序

有什么建议?


问题答案:

我不认为这可以保证调用logger.log(res)的顺序;

实际上,确实如此。该语句在resolve调用之前执行。

有什么建议?

很多。最重要的是您使用手动创建承诺反模式 仅做

promiseWhile(…, function() {
    return db.getUser(email)
             .then(function(res) { 
                 logger.log(res); 
                 count++;
             });
})…

第二,该while功能可以简化很多:

var promiseWhile = Promise.method(function(condition, action) {
    if (!condition()) return;
    return action().then(promiseWhile.bind(null, condition, action));
});

第三,我不会使用while循环(带有闭包变量),而是使用for循环:

var promiseFor = Promise.method(function(condition, action, value) {
    if (!condition(value)) return value;
    return action(value).then(promiseFor.bind(null, condition, action));
});

promiseFor(function(count) {
    return count < 10;
}, function(count) {
    return db.getUser(email)
             .then(function(res) { 
                 logger.log(res); 
                 return ++count;
             });
}, 0).then(console.log.bind(console, 'all done'));


 类似资料:
  • 问题内容: 我试图与本地异步循环ES6承诺这 样的 作品,但不正确。我想我在某个地方犯了一个大错误,我需要有人告诉我它在哪里以及如何正确完成 现在输出: 好的部分:它到了尽头。 不好的部分:它捕获了一些错误,我不知道为什么。 问题答案: 我见过的任何带有promise循环的辅助函数实际上使它变得比您可以使用递归开箱即用的方法差很多。 是的,但是更好一点: 在jsfiddle中查看http://js

  • 问题内容: 用诺言做诸如while循环之类的事情的惯用方式是什么。所以: 如果条件仍然存在,请执行某项操作,然后再次重复执行其他操作。 我这样做是想知道是否有更好/更理想的方法? 输出:1 2 3 4 5 6 7 8 9 10 11完成 问题答案: 我会用一个对象包装值。这样,您可以拥有一个属性来让循环知道您已完成。

  • 问题内容: for (let i = 0; i < 10; i++) { const promise = new Promise((resolve, reject) => { const timeout = Math.random() * 1000; setTimeout(() => { console.log(i); }, timeout); }); 上面将给出以下随机输出: 任务很简单:确保每

  • 本文向大家介绍Node.js插件的正确编写方式,包括了Node.js插件的正确编写方式的使用技巧和注意事项,需要的朋友参考一下 Node.js在利用JavaScript编写后端方面效果拔群,值得我们多加尝试。不过如果大家需要一些无法直接使用的功能甚至是根本无从实现的模块使用,那么能否从C/C++库当中引入此类成果呢?答案是肯定的,大家要做的就是编写一款插件,并借此在自己的JavaScript代码中

  • null 现在的问题是: > 作为控制器方法执行的结果,我将返回对象的映射,该映射将解析为JSON。可能的实体是: {“结果”:“12”} 我应该如何提供基于结果的附加消息?我能想到两个解决办法: > 返回映射,该映射在肯定验证结果的情况下具有result=true,在否定验证结果的情况下具有result=false,以及带有相应消息的errorCode 返回指示验证结果的布尔值,并另外对否定结果

  • 本文向大家介绍详解Swift编程中的for循环的编写方法,包括了详解Swift编程中的for循环的编写方法的使用技巧和注意事项,需要的朋友参考一下 for 循环是一个循环控制结构,可以有效地编写来执行的特定次数的循环。 语法 for 循环在 Swift 编程语言的语法是: 下面是在一个循环的流程控制: 初始化 init 步骤首先被执行,并且仅一次。在这一步,可以声明和初始化任何循环控制变量。 只要