如何处理函数

时间:2017-06-08 10:45:14

标签: javascript promise

以下是我所拥有的简化版本:

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);

有办法做到这一点吗?或者我必须以某种方式做一些回调函数?我不确定最好的方法,任何建议都会有所帮助:)

3 个答案:

答案 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);
});