从承诺返回然后()

时间:2015-12-04 18:14:44

标签: javascript promise

我有一个像这样的javascript代码:

objdump -d a.out --start-address=0x400630 and --stop-address=0x400679 | cut -b 14-30 

对于var测试,我总是有一个未定义的值。我认为这是因为承诺没有解决喷射......有一种方法可以从承诺中返回一个值吗?

10 个答案:

答案 0 :(得分:97)

当您从then()回调中返回某些内容时,它有点神奇。如果返回值,则使用该值调用下一个then()。但是,如果你返回类似promise的东西,那么下一个then()会等待它,并且只有在该承诺结算(成功/失败)时才被调用。

通过https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing_asynchronous_actions

答案 1 :(得分:44)

要使用承诺,您必须调用创建承诺的函数,或者您必须自己创建承诺。你没有真正描述你真正试图解决的问题,但是你自己就是如何创建一个承诺:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

或者,如果您已经有一个返回promise的函数,您可以使用该函数并返回其承诺:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}

答案 2 :(得分:8)

我在这里做的是我从justTesting函数返回了一个promise。然后,您可以在解析函数时获得结果。

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

希望这有帮助!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }

答案 3 :(得分:7)

我更喜欢使用“ await”命令和异步功能来摆脱承诺的混乱,

在这种情况下,我将首先编写一个异步函数, 将使用它代替该问题的“ promise.then”部分下调用的匿名函数:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

然后我将从主函数调用此函数:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

请注意,我在这里将主函数和子函数都返回给异步函数。

答案 4 :(得分:1)

Promises不会“返回”值,它们会将它们传递给回调(您随.then()提供)。

可能是想说您应该在promise实现中执行resolve(someObject);

然后在您的then代码中,您可以引用someObject做您想做的事情。

答案 5 :(得分:0)

对我来说,回调在这种情况下有效。我遇到了同样的问题,所有先前的答案都对我不起作用(我真的不知道为什么)。因此,应该起作用的代码示例:

function justTesting(callback) {
  promise.then(function(output) {
    return output + 1;
  });
}

then call it:

justTesting(function (yourOutput) {
    // here you can use your outpur from justTesting func
    var test = yourOutput;
})  

答案 6 :(得分:0)

返回承诺而不是返回输出;

function justTesting() {
    return promise.then(function(output) {
        // It ??? will not work
        return output + 1;
    });
}

并获得输出

var test;
justTesting().then(function(output) {
    test = output + 1;
})

答案 7 :(得分:0)

您不能在兑现承诺后返回价值。解决诺言后,请调用另一个函数:

function justTesting() {
    promise.then(function(output) {
        // instead of return call another function
        afterResolve(output + 1);
    });
}

function afterResolve(result) {
    // do something with result
}

var test = justTesting();

答案 8 :(得分:0)

您需要使用引用数据类型,如数组或对象。

function foo(u,n){
  let result = [];
  const userBrands = new Promise((res, rej)=> {
                        res(['brand 1', 'brand 3']);
                      })
  
  userBrands.then((ub)=>{
    return new Promise((res, rej) =>{
      res([...ub, 'brand 4', 'brand 5']);
    })
  }).then(response => {
    return result.push(...response);
  });
  return result;
};
foo();

答案 9 :(得分:0)

就这样做:

async function justTesting() {
  const output = await promise;
  return (output + 1)
}

var test = justTesting();