2017-06-08 55 views
0

這裏同時處理一個承諾或變量返回的是什麼,我有一個簡化版本:如何從功能

function test(thisBool){ 
    var response; 
    if(thisBool){ 
     response = makeAPIrequest().then(function(){  
     }, function(err){ 
     console.log(err) 
     }) 
    } else { 
     response = "doesntmatter" 
    }  
} 

所以,如果該參數爲true,使API請求。如果它是假的,則返回'doesntmatter'字符串。

當我打電話給我時,我希望在任何一個實例中都使用響應。

var testResponseTrue = test(true); 
var testResponseFalse = test(false); 

有沒有辦法做到這一點?或者我會不得不做一些回調函數?我不知道這樣做的最佳方式,任何建議都會有所幫助:)

+0

爲什麼不做出承諾autoresolving在情況下,它是假的? – Icepickle

+0

'有沒有辦法做到這一點?' - 不,不是那樣的 –

+0

@JaromandaX他可以,如果他使用異步/等待模式;) – Icepickle

回答

2

返回每個條件的承諾。你已經被從你的API請求方法返回一個承諾,所以你可以使用Promise.resolve()默認

function makeApiRequest(){ 
 
    // fake request ... use your normal method that already returns a prmise 
 
    return new Promise(resolve=>{ 
 
    setTimeout(function(){ 
 
     resolve('Value from request') 
 
    },500) 
 
    }); 
 
    
 
} 
 

 

 
function test(thisBool){ 
 
return thisBool ? makeApiRequest() : Promise.resolve("Default value") 
 
} 
 

 
test(false).then(r => {console.log('False value:', r)}); 
 
test(true).then(r => {console.log('True value:', r)})

+0

這看起來不錯,謝謝 – thatOneGuy

1

這使得您的消費者必須檢查他們現在是否得到承諾,這有點複雜。我寧願選擇到內部去的autoresolving承諾的情況下,布爾是假的,這樣就可以像使用一個布爾值,它是真正的處理以同樣的方式迴應

// mock 
 
function makeAPIrequest() { 
 
    return new Promise((resolve) => setTimeout(() => resolve('done'), 100)); 
 
} 
 

 
function test(thisBool){ 
 
    return new Promise((resolve, reject) => { 
 
    if (thisBool) { 
 
     makeAPIrequest().then(result => resolve(result)).catch(err => reject(err)); 
 
     return; 
 
    } 
 
    setTimeout(() => resolve('does not matter'), 0); 
 
    }); 
 
} 
 

 
test(true).then(response => console.log('response from true = ' + response)); 
 
test(false).then(response => console.log('response from false = ' + response));

如果你真的想趕上值的變量,我想你也可以在下面的代碼片段

(async() => { // mock 
 
    function makeAPIrequest() { 
 
    return new Promise((resolve) => setTimeout(() => resolve('done'), 100)); 
 
    } 
 

 
    let test = function async(thisBool){ 
 
    return new Promise((resolve, reject) => { 
 
     if (thisBool) { 
 
     makeAPIrequest().then(result => resolve(result)).catch(err => reject(err)); 
 
     return; 
 
     } 
 
     setTimeout(() => resolve('does not matter'), 0); 
 
    }); 
 
    } 
 

 
    var testResponse1 = await test(true); 
 
    var testResponse2 = await test(false); 
 
    console.log(testResponse1); 
 
    console.log(testResponse2); 
 
})();
使用 async/await pattern,像

1

您應該使用回調或承諾來處理這種情況。下面是使用回調相同的代碼片段:

function test(thisBool, callback) { 
    var response; 
    if(thisBool) { 
     makeAPIrequest() 
     .then(function(response) { 
      callback(response);  
     }, function(err) { 
      callback(err); 
     }) 
    } else { 
     response = "doesntmatter"; 
     callback(response); 
    }  
} 
test(true, function(testResponseTrue) { 
    console.log(testResponseTrue); 
}); 
test(false, function(testResponseFalse) { 
    console.log(testResponseFalse); 
});