2017-07-17 105 views
0

在下面的函數中,我試圖返回第二個異步調用的promise對象,但是typescript抱怨函數必須返回一個值。我不知道我怎麼能做到這一點?我如何退還第二個承諾?返回第二個承諾TypeScript jquery承諾

private getSalesUrl<TServiceInput>(serviceCall: (args: TServiceInput) => JQueryPromise<IServiceResponseT>, args): JQueryPromise<any> { 
     serviceCall(args).done(result => { //1st async call 
      if (result.serviceOutput) { 
       if (result.serviceOutput.key === "URL") { 
        return tipsInterop.executeSalesRequest(result.serviceOutput.value); //2nd async call 
       } 
      } 
     }); 
    } 
+0

的'return'是serviceCall的')了'done'回調('掉了。你需要'返回serviceCall(...)'以便通過serviceCall返回內部返回... – marekful

+0

如果我返回serviceCall,那麼getSalesUrl.done()將在第一個異步調用的上下文中執行。我想getSaleUrl.done()在第二次異步調用的上下文中執行。 –

+1

A)不要使用'done'或'fail',總是使用'then'。 B)你實際上並沒有從'getSalesUrl'返回任何東西,但是你只從完成的回調函數返回 – Bergi

回答

0
  • 基於什麼OP要求和SO的意見,我假設OP需要第二個請求的承諾,退還
  • 這不應該,因爲它基本侷限於打字稿或JavaScript Ajax調用
  • 這個例子的功能使用簡單的JavaScript和jQuery AJAX請求

var requests = { 
 
    firstRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1'); 
 
    }, 
 
    secondRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2'); 
 
    } 
 
}; 
 

 
var processResults = { 
 
    callService: function() { 
 
    return requests.firstRequest().then((data, textStatus, promise) => { 
 
     return requests.secondRequest().then((data2, textStatus2, promise2) => { 
 
     return "This is the content of second call: id=>" + data2.id; 
 
     }); 
 
    }); 
 
    } 
 
}; 
 

 
processResults.callService().then((data, textStatus, promise) => { 
 
    console.log(data); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

注:

  • (如果返回從此數據調用它被包裹成一個新的承諾,通過@Bergi評論默認情況下)我回到裹成一個承諾第二個呼叫的數據
  • 這是通過攔截和傳遞數據
  • 其他的方式來傳遞第二個呼叫的數據的一種方法是回到promise2即使用return promise2代替return "This is the content of second call: id=>"+ data2.id;

下面是它如何出現,如果你return promise2;

var requests = { 
 
    firstRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1'); 
 
    }, 
 
    secondRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2'); 
 
    } 
 
}; 
 

 
var processResults = { 
 
    callService: function() { 
 
    return requests.firstRequest().then((data, textStatus, promise) => { 
 
     return requests.secondRequest().then((data2, textStatus2, promise2) => { 
 
     return promise2; 
 
     }); 
 
    }); 
 
    } 
 
}; 
 

 
processResults.callService().then((data, textStatus, promise) => { 
 
    console.log(data); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>