如何使用同一个Promise多次?

时间:2016-03-03 11:28:01

标签: javascript node.js

// App.js
sites[site_name].search(value).then(function(results) {
    console.log(results);
});

// SearchClass.js
Search.prototype.search = function(search) {
    var self = this;

    this.params['wa'] = search;

    return new Promise(function(resolve, reject) {
        self.resolve = resolve;
        self.reject  = reject;

        request(SEARCH_URL + '?' + querystring.stringify(self.params), function (error, response, body) {
            if (!error && response.statusCode == 200) {

                // Some code

                for (var i = 1; i <= pages; i++) {

                    // Some Code

                    request(SEARCH_URL + '?' + querystring.stringify(self.params), function (error, response, body) {
                        if (!error && response.statusCode == 200)
                            self.resolve(body);
                    });
                }
            }
        });
    });
};

在我的app.js我有一个我需要解析的网站列表。我需要将所有网站的结果显示为一个列表。在我的搜索类中,我在所选网站上搜索不同的页面,然后通过promise返回我的结果。目前我只从第一次resolve电话中获取数据。有可能以某种方式使用它倍增时间吗?

1 个答案:

答案 0 :(得分:2)

在循环之前创建一个数组变量,而不是解析&#34;父承诺&#34; ,为循环中的每个请求推送一个新的Promise到数组。循环后使用`Promise.all&#39;等待所有承诺,然后解决父承诺。

这样的事情:

// SearchClass.js
Search.prototype.search = function(search) {
  var self = this;

  this.params['wa'] = search;

  return new Promise(function(resolve, reject) {

      request(SEARCH_URL + '?' + querystring.stringify(self.params), function (error, response, body) {
            if (error || response.statusCode !== 200) {
                return reject(error || response.statusCode);
            }

            var promises = [];

            for (var i = 1; i <= pages; i++) {
                promises.push( new Promise(resolve,reject){
                    request(SEARCH_URL + '?' + querystring.stringify(self.params), function (error, response, body) {
                        if (!error && response.statusCode == 200){
                            resolve(body);
                        }
                        else {
                            reject(error || response.statusCode);
                        }
                    });
                });
            }
            resolve(Promise.all(promises));
      });
  });
};

请注意,我还没有尝试过(对不起,我知道这是一个糟糕的答案)我可能已陷入某种逻辑陷阱,但我认为你会得到它背后的逻辑至少