以下是我所拥有的简化版本:
function test(thisBool){
var response;
if(thisBool){
response = makeAPIrequest().then(function(){
}, function(err){
console.log(err)
})
} else {
response = "doesntmatter"
}
}
因此,如果参数为true,请发出api请求。如果它是错误的,请返回“不要做的事情”。字符串。
当我这样称呼时,我希望在任何一个实例中使用响应。
var testResponseTrue = test(true);
var testResponseFalse = test(false);
有办法做到这一点吗?或者我必须以某种方式做一些回调函数?我不确定最好的方法,任何建议都会有所帮助:)
答案 0 :(得分: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)})

答案 1 :(得分:1)
这使得消费者必须检查他们现在是否收到承诺有点复杂。我希望在boolean为false的情况下选择在内部进行自动解析保证,以便您可以像使用布尔值相同的方式处理响应
// 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/await pattern
,如下面的代码段
(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 );
})();
答案 2 :(得分: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);
});