如何在没有async.waterfall

时间:2018-04-02 06:32:13

标签: javascript jquery arrays callback

我有一系列ajax调用,它们逐个执行。在任何ajax调用失败之间它应该失败像瀑布这样的剩余调用。

var waterfallData = [{
    "name":"nodejs"
},{
    "name":"javascript"
},{
    "name":"angularjs"
},{
    "name":"mongodb"
}];

function wf(data,cb){
    if(data.name == "angularjs"){
        cb(null,"error");
    }else{
        cb(data,null);
    }
}

var finalData = {
    "dataCheck":""
}
waterfallData.forEach(function(checkData) {
        wf(checkData,function(result){
            console.log(result);
            return true;
        },function(err){
            console.log("error",err);
            return false;
        })
    });

这里它正在作为系列调用执行。但我不想使用异步瀑布。

我想在任何情况下失败时停止循环。谁可以帮我这个事。 提前谢谢

2 个答案:

答案 0 :(得分:1)

如果他们是ajax调用,那么你应该使用带有Fetch和Promises的代码。将代码放入异步函数,然后执行:

for (obj of waterfallData) {
  const response = await obj.name; // or whevever you get the URL from
  if (!response.ok) {
    // the response failed for some reason,
    // break out of this iteration and do not do any more iterations:
    break;
  }
  const responseText = await response.text();
  // do other stuff with the responseText
}

答案 1 :(得分:1)

您可以宣传您的wf功能,并使用 for-loop

重复waterfallData
function promiseWF( data )
{
   return new Promise( ( resolve, reject ) => {
      if( data.name == "angularjs"){
         reject(null,"error");
      }
      else{
         resolve(data,null);
      }
   });
}

现在,您可以将简单的 for-loop successFlag

一起使用
  async function waterFallInSequence() 
  {
    var successFlag = true;
    for (var counter = 0; successFlag && counter < waterfallData.length; counter++) 
    {
      await promiseWF( waterfallData[ counter ] )
         .then( ( result ) => { 
             console.log( result ); 
         }) 
         .catch( ( error ) => { 
             console.log( error ); 
             successFlag =  false; //make this flag false so that for-loop fails
         })
    }
  }