在javascript异步函数中创建循环

时间:2017-07-01 11:28:55

标签: javascript loops promise

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等。 在这种情况下,我想为此实现一个循环。但由于这是异步,我无法处理相同的问题。 请建议在这种情况下如何处理承诺。

1 个答案:

答案 0 :(得分:0)

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

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

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.all()告诉我们所有这些承诺何时完成,并将所有承诺的已解析值提供给{{1数组。