【问题标题】:Creating a loop in javascript Async Function在 javascript 异步函数中创建循环
【发布时间】:2017-07-01 11:28:55
【问题描述】:
createDatabase(){
request({
        url: `http://${nodeName}:port?format=json`,
        auth: {
          'username': 'admin',
          'password': 'admin',
          'sendImmediately': false
        },
        method: 'POST',
        json: true,
        body: payload
      },
        function (error, response, body) {
          if (response.statusCode != "201") {
            resolve(response.statusCode);
            done();
          }
          else {
            reject();
            done();
          }
        })
}

这是我用来在我的应用程序中创建数据库的代码。我需要创建多个数据库示例 - db1、db2、db3 等。 在这种情况下,我想为此实现一个循环。但由于这是异步的,我无法处理。 请建议在这种情况下如何处理承诺。

【问题讨论】:

  • 如果你可以使用fetch-api,也许你可以看看这个question
  • Promise.all(["some","variables"].map(createDatabase))
  • 你想循环什么?每次迭代会有什么不同?
  • 您是要串联创建它们(创建一个,等到完成,然后创建下一个)还是要并行创建它们(开始创建它们并在它们完成时收到通知都完成了)?另外,您在循环中更改了什么变量 - 您的代码没有显示?
  • 是的,我想连续创建它们..

标签: javascript loops promise


【解决方案1】:

首先,我使用 request-promise 模块将 request() 替换为一个返回承诺的函数,这样您就可以使用承诺而不是普通的回调来管理事情何时完成。

然后,如果您可以并行创建所有数据库并且只需要知道它们何时完成,您可以这样做:

const rp = require('request-promise');

function createDatabase(payload) {
    return rp({
        url: `http://${nodeName}:port?format=json`,
        auth: {
          'username': 'admin',
          'password': 'admin',
          'sendImmediately': false
        },
        method: 'POST',
        json: true,
        body: payload
  });
}

let promises = [];
// some for loop that creates separate payloads to pass to createDatabase
for (...) {
    // create payload for each database here

    promises.push(createDatabase(...));
}

Promise.all(promises).then(function(results){
    // process array of results here
}).catch(function(err) {
    // handle error here
});

这会将每次调用 createDatabase() 的 Promise 收集到一个数组中,然后使用 Promise.all() 告诉我们所有这些 Promise 何时完成,并将所有 Promise 的解析值提供到一个 results 数组中。

【讨论】:

  • 感谢您的回复。但这不会停止下一个函数的执行。它将提供请求结果,不知道什么时候..!!我想验证数据库是在下一个函数调用中创建的,我正在获取创建的数据库的 ID。
  • @VipulGoyal - 欢迎来到 nodejs 中的异步编程。打开所有数据库后要执行的代码位于.then() 回调中或从那里调用的函数中。这就是 node.js 中异步编程的工作方式。 Javascript 中没有办法让解释器“等待”一切都完成后再继续。相反,您将功能嵌套在异步回调中。 Promise 可帮助您以更简洁的方式完成此任务,尤其是在您尝试协调多个异步操作时。
  • @VipulGoyal - 另外,如果您需要更多关于您正在做的事情的帮助,请向我们展示更多代码,以便我们可以看到您在此处尝试执行的其他操作。根据您显示的代码,我已经回答了您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2018-09-25
  • 2020-03-07
  • 1970-01-01
相关资源
最近更新 更多