你如何发送已解决的承诺的回复?

时间:2018-02-17 22:40:44

标签: javascript node.js promise httpresponse

我有一个链接数组,我想从中获取响应数据,使用该响应中的特定数据填充对象,然后通过路径发送带有响应数据的对象数组。

const apartmentObjectArray = apartmentLinks.map((link) => {
  helper.sendApartmentData(link)
});

res.send(apartmentObjectArray);

我遇到的问题是,在发送响应之前,响应才会得到解决。我尝试在响应之前创建一个变量,并将对象分配给该变量,但这不起作用。我问过的每个人都说异步调用是如何工作的,这很好,他们可以告诉我,但他们没有告诉我解决问题的方法。

function sendApartmentData(link) {
  axios.get(link).then(response => {
    parseString(response.data, (err, result) => {
      const code = access(result, 'SearchResults:searchresults.message[0].code[0]');    
      if (code !== '0') {
        console.log('An error occured');
      } else {
        const resultArray = access(result, 'SearchResults:searchresults.response[0].results[0].result');
        resultArray.forEach(obj => {
          const dataObj = {};
          // populate dataObj...
        });
      }
    });
  });
}

1 个答案:

答案 0 :(得分:0)

您应该使用Promise.all

  

Promise.all(iterable)方法返回一个Promise,它在iterable参数中的所有promise都已解析或者iterable参数不包含promise时解析。它拒绝承认拒绝的第一个承诺。

这是一种简单的方法,可以在完成所有需要执行的异步操作后立即执行一段代码。一旦异步操作失败,它也会失败。

let apartmentDataPromises = [];
apartmentLinks.map((link) => {
    apartmentDataPromies.push(helper.sendApartmentData(link));
});

Promise.all(apartmentDataPromises).then(apartmentObjectArray => {
    res.send(apartmentObjectArray);
}).catch(err => console.log(err));

function sendApartmentData(link) {
    return new Promise((resolve, reject) => {
        axios.get(link).then(response => {
            parseString(response.data, (err, result) => {
                const code = access(result,'SearchResults:searchresults.message[0].code[0]');

                if (code !== '0') {
                    reject('An error occured');
                } else {
                    const resultArray = access(result,'SearchResults:searchresults.response[0].results[0].result');
                    resultArray.forEach(obj => {
                        const dataObj = {};
                        // populate dataObj...
                        resolve(dataObj);
                   });
                }
            });
        });
    });
}