2017-05-20 101 views
0

我正在撞牆,想弄清楚如何將異步寫入文件的數據推送到數組中。同步寫入數據(並檢查項目是否是列表中的最後一項)需要太多時間,因此我決定使其運行異步。做了一些研究後,似乎我可以使用回調異步操作完成後運行一個函數

我不希望使用外部庫來做到這一點,因爲我非常確定回調或Promise應該做的伎倆。謝謝!

//Iterate through list and make HTTP request to get data 
dataDocument.map(function(item, index) { 

    request(item, function(err, res, html) { 
     if (err) throw err; 
     renderData(html, item); 
    }); 

}); 

//Renders data 
function renderData(html, item) { 
    ...some calculations here. 

    writeData(output, id, function() { 
     pushed(output); 
    }); 
}; 

//Writes the data on file 
function writeData(output, id) { 
    fs.appendFile('./output.json', output); 

//SHOULD I USE A CALLBACK HERE TO PUSH INTO AN ARRAY ONCE IT'S COMPLETE? 

}; 

//NEED HELP HERE: Pushed the data into an array and eliminates last comma. 
function pushed(data) { 
    var arr = []; 
    arr.push(data); 
} 
+0

不明白「檢查,如果該項目是最後的名單上)花費太多的時間,所以我決定把它運行異步」。你能基本描述這個數據處理的工作流程嗎? – wannadream

+0

你通常不會只是決定做一些異步的東西。底層操作既可以是或者不是異步的。向數組添加項目本身並不是異步的。 'fs.appendFile()'本身是異步的。真的不知道你想要完成什麼。目前尚不清楚的問題。請詳細說明你想要做的事情。而且,請在您的問題中使用文字,而不是在您的代碼中留言。 – jfriend00

+0

返回承諾並連接'.then'來創建一個承諾級聯,這將以迭代方式調用。 – botika

回答

0

隨着承諾它會看起來更乾淨和更精簡。 Promisify所有相關功能,並使用Promise.all當你收集的所有數據就知道:

// Promisify all the involved callback-based functions: 
function promiseRequest(item) { 
    return new Promise(function (resolve, reject) { 
     request(item, function (err, res, html) { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(html); 
      } 
     }) 
    }) 
} 

//Renders data 
function promiseRenderData(html, item) { 
    //...some calculations here. 
    return promiseWriteData(output, id).then(function() { 
     return output; 
    }); 
}; 

//Writes the data on file 
function promiseWriteData(output, id) { 
    return new Promise(function (resolve, reject) { 
     fs.appendFile('./output.json', output, function (err) { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(); 
      } 
     }); 
    }); 
} 

//Iterate through list and make HTTP request to get data 
Promise.all(dataDocument.map(function(item, index) { 
    return promiseRequest(item).then(function(html) { 
     return promiseRenderData(html, item); 
    }; 
})).then(function(arr) { 
    // Do something with `arr` here 
}); 
相關問題