場景:recommendationsArr
是一個項目數組(它的99.9%非空,但因爲它的外部API調用,我更喜歡檢查)。目的是爲valueOne
,validItem
和更新的recommendationsArr
設定值。
有效性取決於valueOne
的存在,所以如果recommendationsArr[0]
有效valueOne
那麼我不需要獲取數組其餘部分的結果。如何對異步承諾電話進行同步條件檢查
const getContent = function (item) {
console.log("####### Inside the getContent function #########");
contentResponse = fetchContent(item);
return contentResponse;
}
if (recommendationsArr.length > 0) {
console.log("####### If Condition #########");
recommendationsArr.find((item) => {
getContent(item).then(function(response){
try { // to get valueOne
console.log("####### Try for: ######### ", term);
valueOne = response.content.valueOne; //may or may not be present
recommendationsArr.splice(recommendationsArr.indexOf(item), 1); // this is for styling first occurence is styled differently so thats popped out
validItem = item;
console.log("##### Valid item is: ", term);
return true;
} catch (err) {
console.log("##### Item not valid: ", recommendationsArr.indexOf(item));
valueOne = null;
return false;
}
});
});
console.log("######### Just hanging out!!! #########");
return {
component: <Layout><ComponentName
//pass other non-dependent props
validItem={validItem}
valueOne={valueOne}
recommendationsArr={recommendationsArr}
/></Layout>,
title: `Page Title`,
};
}
return null;
假設recommendationsArr = ["blue", "white", "green", "red"]; //usually the array is anywhere between 12-50 elements
這是怎麼回事,控制檯日誌:
####### If Condition #########
####### getApiContent response for ######### blue
####### getApiContent response for ######### white
####### getApiContent response for ######### green
####### getApiContent response for ######### red
######### Just hanging out!!! #########
####### Try for: ######### blue
//I see data here
##### Valid item is: blue
####### Try for: ######### white
//I see data here
##### Valid item is: white
####### Try for: ######### green
//I see data here with valueOne missing in returned data
##### Item not valid: green
####### Try for: ######### red
//I see data here
##### Valid item is: red
正如你看到的,API請求getContent
保持請求所有的條款,然後奧菱到達.then
。這導致了我不需要的一大堆api請求 - 響應,我知道我試圖在asyc .then
上同步調用try/catch
,但我不知道如何實現這一點。
理想情況下,不應調用API,除非.then
返回false,如果try
返回true - 不再有API請求並退出。另外,我需要訪問.then
以外的response
來更新組件的道具。我該如何實現這個目標?我簡要閱讀了關於async library,是否適合這種情況?
任何幫助/指導表示讚賞。我一直堅持這一
那是什麼'recommendationsArr.find(...)'調用,爲什麼你不理它的結果呢? – Bergi
@Bergi因爲我不想遍歷整個數組,所以對第一個最佳匹配感興趣,我正在使用arr.find(https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Reference/Global_Objects/Array/find)而不是arr.forEach。我不確定我是如何忽略其結果的,你能否在代碼中指出? – user988544
既不能用於異步回調: - /你只是沒有對返回值做任何事情而忽略結果。 – Bergi