2017-10-11 59 views
1

所以我有一個四個JSON對象的數組,我想向這些對象中的每個添加三個新的字段。爲此,我需要爲每個要添加的新字段設置一個異步函數。理想情況下,我想要做的是將異步函數限制爲每次只更新兩次。最後,回調原始函數並打印出新形成的數組。但我不能得到這個工作,雖然我覺得我靠近......異步數組函數

var async = require('async'); 

// My Array of JSON objects 
var allIssues = [ 
    { id: '1', color: 'blue' }, 
    { id: '2', color: 'red' }, 
    { id: '3', color: 'gold' } 
]; 

addExtraFeaturesToEachissue(allIssues, function(data) { console.log(data); }); 

function addExtraFeaturesToEachissue(allIssues, callback) { 
    async.each(
     allIssues, 
     async.applyEach([addheight, addWidth, addWeight]), 
     callback(data) 
    ); 
} 

function addHeight(issue, callback) { 
    setTimeout(function() { 
     issue.fields['height'] = "1000"; 
     callback(issue); 
    }, 100); 
} 
function addWidth(issue, callback) { 
    setTimeout(function() { 
     issue['width'] = "100"; 
     callback(issue); 
    }, 300);  
} 
function addWeight(issue, callback) { 
    setTimeout(function() { 
     issue.['weight'] = "500"; 
     callback(issue); 
    }, 200); 
} 
+0

請包括預期的JSON數組的形狀。另外,爲什麼你選擇異步方法並延遲使用超時填充JSON數組? –

+0

[ {id:'1',color:'blue','width':100,'weight':'500',height:'1000'}, {id:'2',color:'red' ,'寬度':100,'重量':'500',高度:'1000}, {id:'3',顏色:'gold','width':100'weight':'500' :'1000} ]; 他們區域實際上更復雜的功能,我只是把一個隨機計時器,以表明他們需要一段時間來執行 –

回答

2

假設調用的函數會做一些長期的任務,老實說,我不認爲使用異步的需要,爲什麼不使用Promise?

// My Array of JSON objects 
var allIssues = [ 
    { id: '1', color: 'blue' }, 
    { id: '2', color: 'red' }, 
    { id: '3', color: 'gold' } 
]; 

addExtraFeaturesToEachissue(allIssues, function(data) { console.log(data); }); 

function addExtraFeaturesToEachissue(allIssues, callback) { 
    var requests = allIssues.map((issue) => { 
    return addHeight(issue).then(addWidth).then(addWeight); 
    }); 
    Promise.all(requests).then((data) => console.log('done', data)); 
} 

function addHeight(issue) { 
    return new Promise((resolve, reject) => { 
    setTimeout(function() { 
     issue.height = "1000"; 
     resolve(issue); 
    }, 100); 
}); 
} 
function addWidth(issue) { 
    return new Promise((resolve, reject) => { 
    setTimeout(function() { 
     issue.width = "100"; 
     resolve(issue); 
    }, 300); 
    }); 
} 
function addWeight(issue) { 
    return new Promise((resolve, reject) => { 
    setTimeout(function() { 
     issue.weight = "500"; 
     resolve(issue); 
    }, 200); 
    }); 
} 

編輯我剛看到你whant末,整個陣列。正如Jared Smith所建議的那樣,您可以使用Promise.all;)

+0

看看'Promise.all' ... –