如何以承诺方式调用函数

时间:2018-07-31 18:35:29

标签: javascript node.js promise

我对JS还是陌生的,我试图了解npm软件包中的文档。该文档是:

client.projects.get(); // Promise

我已经阅读了有关Promises的一些文档,但是我仍然不确定如何调用它并使它返回我期望的结果。

程序包在这里供参考:https://github.com/markmssd/bitbucket-server-nodejs

5 个答案:

答案 0 :(得分:2)

Promise是代码的异步执行。

您可以在Promise上使用.then方法从该异步代码返回值。您将必须传递处理返回值的回调函数。

client.projects.get().then(function(foo) {
// this foo is returned from client.projects.get() async operation
})

万一异步操作引发异常,您可以在承诺中使用.catch捕获那些异常。

client.projects.get().then(function(foo) {
    // this foo is returned from client.projects.get() async operation
}).catch(function(err) {
   // something went wrong while executing client.projects.get()
})

答案 1 :(得分:2)

client.projects.get();将返回promise,而不可能返回“您的期望”。

您应该做的就是这样称呼它:

client.projects.get().then((result) => {
    // do with `result` your logic
    console.log(result);
});

,然后在作为参数传递给then函数的回调中,接收响应提供的result并根据您的逻辑使用它。

答案 2 :(得分:1)

玩:

client.projects.get().then(result => console.log(result))

您会注意到,在兑现承诺时,一旦准备好,您将需要指定如何处理其结果。

仅返回结果的替代方法是:

client.projects.get().then(res => res)

如果有错误,您还需要添加一个捕获:

client.projects.get().then(res => res).catch(err => console.error(err))

如果出现故障或某种故障,它将注销一个错误。

答案 3 :(得分:1)

Promise对象表示一个值,该值可能尚不可用,但将来会被解析。它允许您以更同步的方式编写异步代码。一旦承诺解决,您就可以得到结果,或者在承诺被拒绝(失败)的情况下捕获错误。在您的情况下,您必须像这样调用函数:

  client.projects.get().then(function(result){
       console.log(result);
    }).catch(function(err) {
        // handle error
        console.log("something went wrong",err);
     });

或者,您也可以将promise存储到从函数调用返回的变量中并获取结果,如下所示:

var promise = client.projects.get();

promise.then(function(result){
   console.log(result);
}).catch(function(err) {
    // handle error
    console.log("something went wrong",err);
 });

将已分配的Promise到变量中可能不是一个好选择,但是当有多个函数返回Promise并且我们希望在所有Promise都解决后执行一些代码时,这将非常有用。像这样:

var p1 = asyncFunction1();
var p2 = asyncFunction2();
Promise.all([p1,p2]).then(function(results){
 // do something with results
});

You can also check this nice blog on promises

答案 4 :(得分:0)

> p.then(onFulfilled [,onRejected]);

已完成  -如果实现了承诺,则会调用该函数。

onRejected (可选)  -如果Promise被拒绝,则调用一个函数。

p.then(function(value) {
   // fulfillment
 }, function(reason) {
  // rejection
 });

>尝试->捕获->最终

p.then(function(data) { console.log("Play with your data.") })
   .catch(function(error) { console.log(error); })
   .finally(function() { console.log("Something need to do, no matters fail or sucess") });
  1. 如果您希望在诺言达成后进行一些处理或清理,而不管其结果如何,那么finally()方法将很有用。
  2. finally()方法与调用.then(onFinally,onFinally)非常相似

更多details


因此,您可以编写如下代码:

 client.projects.get().then(function(value) {
    // fulfillment
  }, function(reason) {
    // rejection
  });

 client.projects.get()
   .then(function(data) { console.log("Play with your data.") })
   .catch(function(error) { console.log(error); })
   .finally(function() { console.log("Finally do something.") });