Javascript 如何将3个请求称为异步?

Javascript 如何将3个请求称为异步?,javascript,node.js,promise,Javascript,Node.js,Promise,我必须做一个功能测试,如果3个API正在运行。 因此,用户将单击TestAPI按钮,它将返回每个API的状态(状态:200500404等)。如果API返回错误,我应该显示错误堆栈。 屏幕示例: API Status Detail url1.com 200 - url2.com 200 - url3.com 500 internal server error 我的问题是,如何并行调用这3个请求并返回异步结果,我的意思是

我必须做一个功能测试,如果3个API正在运行。 因此,用户将单击TestAPI按钮,它将返回每个API的状态(状态:200500404等)。如果API返回错误,我应该显示错误堆栈。 屏幕示例:

API       Status      Detail
url1.com   200          -
url2.com   200          -
url3.com   500     internal server error
我的问题是,如何并行调用这3个请求并返回异步结果,我的意思是如何在不必等待所有请求的结果的情况下更新API请求状态屏幕

我是基于这个,但它会同步返回结果

*******编辑******

这是我目前的密码

app.get('/testDependencies', function (req, res, next) {    

    let objTestsResul = {}        
    var urls = ['url1', 'url2', 'url3'];
    let index = 0
    while(urls.length > 0) {
      let url = urls.shift();
      objTestsResult[index++] = testURL(url)

   }

    res.send(objTestsResult)
});
此函数对于每个URL都是相同的:

function testURL(URL){

   fetch(URL, {
        method: 'GET'      
    })
        .then(res => {
            res.json()            
        })
        .then(json => {
            console.log(json)
            return json      
         })
        .catch(error => {            
            return error
          })
}

如果您可以使用:

您只需确保promise函数实际返回承诺:

function testURL(URL) {
  let start_time = new Date().getTime();   

  return fetch(URL, {
    method: 'GET'      
  }).then(res => {
    res.json()            
  }).then(json => {
    console.log(json)
    return json      
  }).catch(error => {            
    return error
  })
}
承诺不能被依赖链接,除非您从链接中涉及的函数显式返回它们

如果您能够使用
async
wait
,我也建议您这样做,因为这样做可以大大简化其他复杂的代码。

Promises
()似乎就是您要找的。它们本质上是更具可读性的回调版本,允许您在发生其他事件时执行代码,而不必等待触发器发生后再继续执行

let endpoint1=()=>新承诺(resolve=>setTimeout(()=>resolve('200'),1000));
让endpoint2=()=>newpromise(resolve=>setTimeout(()=>resolve('201'),2000));
让endpoint3=()=>newpromise(resolve=>setTimeout(()=>resolve('500'),1500));
document.getElementById('test').addEventListener('click',()=>{
document.getElementById('status').textContent='testrunning…';
我保证([
endpoint1()。然后(a=>document.getElementById('result1')。textContent=a),
endpoint2()。然后(a=>document.getElementById('result2')。textContent=a),
endpoint3()。然后(a=>document.getElementById('result3')。textContent=a),
]).then(()=>document.getElementById('status')。textContent='testcomplete');
});
测试
状态:未运行
端点1:
终点2:

端点3:
Express无法发送多个响应。您必须完成所有调用或使用
WebSockets
来流式传输数据

函数testURL(URL){
返回新承诺((解决、拒绝)=>{
如果(URL=='url2'){
拒绝(新错误(“内部服务器错误”);
返回;
}
解决({状态:200});
});
}
常量main=async()=>{
常量URL=['url1','url2','url3'];
//返回已解决和拒绝的承诺,因为如果一方未能履行承诺。所有
//函数将抛出,我们将无法访问任何已解决的承诺。
const results=wait Promise.all(URL
.map(url=>testURL(url).then(response=>response.catch(error=>error));
//每个错误都有一个堆栈属性,请将状态设置为所需的任何状态
//基于错误并存储堆栈和消息
const objTestsResul=results.reduce((result,cur,i)=>{
结果[URL[i]]=cur.stack
?{状态:500,消息:cur.message,堆栈:cur.stack}
:cur;
返回结果;
}, {});
控制台日志(objTestsResul);
};

main()您是否检查了
承诺。所有的
?您必须显示我们应该修复的代码。请发布您到目前为止拥有的:)好的。我将用代码更新这个问题,在这种情况下,只需分别发出所有请求,并让每个请求更新屏幕上自己的元素(或将内容附加到单个现有元素)。实际上,只有3个独立的请求可以满足您的需要。不需要什么聪明的东西。如果这是客户端Ajax,也就是说(默认情况下运行异步)。还是说服务器端代码?
function testURL(URL) {
  let start_time = new Date().getTime();   

  return fetch(URL, {
    method: 'GET'      
  }).then(res => {
    res.json()            
  }).then(json => {
    console.log(json)
    return json      
  }).catch(error => {            
    return error
  })
}