2016-01-15 31 views
3

我遇到了函數返回未定義數組的問題。Promise.all返回一個未定義的數組

這裏是代碼:

classMethods.getQueries = function(models, dbId, dateStart, dateEnd) { 
    return new Promise(function(resolve, reject) { 

    /* Fetch database .... */ 
    .then(extractQueries, reject) 
    .then(sortQueries, reject) 
    .then(onlyTen, reject) 
    .then(addText, reject) 
    .then(function(queries) { 
     console.log('getQueries finished', queries) ; //array of 10 undefined! 
     resolve(queries); 
    }, reject); 

    /* Functions here .... */ 

    }); 
}; 

一切都很好,直到addText功能:

function addText(queries) { 
    return Promise.all(queries.map(function(query) { 

    models.queries.findById(query.queryId, { raw: true, attributes: ['query'] }) 
    .then(function(queryFetched) { 
     query.text = queryFetched.query; 
     console.log(query); 
     return Promise.resolve(query); 
    }, function(error) { 
     return Promise.reject(error); 
    }); 

    })); 
}; 

這是給我的oupout像:

getQueries finished [undedfined 10x] 

10x 
[query database] 
{queryId: ***, text: ********} 

我不知道爲什麼諾言是循環未完成時返回。

感謝您的幫助。

+0

沒有理由來包裝你的承諾那樣。 – MinusFour

回答

8

這是因爲你沒有返回在地圖中的回調的任何承諾:

function addText(queries) { 
    return Promise.all(queries.map(function(query) { 
    // add return here or the map returns an array of undefined 
    return models.queries 
     .findById(query.queryId, { 
     raw: true, 
     attributes: ['query'] 
     }) 
     .then(function(queryFetched) { 
     query.text = queryFetched.query; 
     console.log(query); 
     return Promise.resolve(query); 
     }, function(error) { 
     return Promise.reject(error); 
     }); 

    })); 
}; 
+0

嗯,是的,我迷惑了地圖的回報和當時的回調。謝謝您的幫助! –

0

所以在這裏我的問題的解決方案: