如何多次使用同一个承诺

How to use same Promise more than one time?

本文关键字:一个承诺 何多次      更新时间:2023-09-26
// 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中,我有一个需要解析的网站列表。我需要将所有站点的结果显示为一个列表。在我的搜索类中,我在所选网站上搜索不同的页面,然后通过承诺返回我的结果。目前,我仅从第一次resolve呼叫中获取数据。是否有可能以某种方式使用它成倍?

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

像这样:

// 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));
      });
  });
};
请注意,我

还没有尝试过(对不起,我知道这是一个糟糕的答案)我可能陷入了一些逻辑陷阱,但我认为你至少会明白它背后的逻辑。