4
function fn1() {
    var promise = new Promise(function(resolve, reject) {
        // ... some code

        if ( /*异步操作成功*/ ) {
            resolve(value); //怎么将这个值作为fn1函数的返回值?
        } else {
            reject(error);
        }
    });

    return promise.then(function(value) {
        return value;  //这么写对吗?
    })
}

总的意思就是返回异步回调函数的返回值,如果使用promise不行,使用回调函数怎么能实现?

lvsjack 237
2016-12-22 提问
4

promise只能传递值,但是却不能返回值。
也就是说,通过then连接起来的每一步操作,是可以接收到上一步产生的值的,但是这个值,在外面是接收不到的。你想要利用这个异步操作产生的值,要么用then把你的操作串起来,要么设定个全局变量来接收你这个值。

xiaoboost · 2016-12-22

添加评论
8 个回答
4

已采纳

下面的方法可以获取 Promise 抛出的状态值。

说明
1.采用了ES7 语法 —— async await
2.下述代码是在 React 中运行的,调用函数采用的this.funcName()
3.获取 Promise 更常用的场景是在 Redux 中。在 action 中,返回 promise 状态值,在 container 组件中获取。

fetchPromiseValue = () => {
    return new Promise(function(resolve, reject) {
        resolve({value: 'PromiseReturnValue'});   // Promise 抛出状态值
    })
};

handlePromise = async () =>{
    let  getValue  = await this.fetchPromiseValue();  // 异步获取 Promise  抛出的状态值
    console.log('Promise 的状态值: ',getValue.value);
};
5

看了这么多,还是让我来回答一个正确答案吧,那就是

promise 不能返回值

只能返回promise,因为它是异步的,外部要用就得 fn1().then(value => console.log(value)) 的方式拿到

1

直接改成:

function fn1() {
    return new Promise(function(resolve, reject) {
        // ... some code

        if ( /*异步操作成功*/ ) {
            resolve(value)
        } else {
            reject(error);
        }
    });
}

接着就可以:

fn1().then(function(value){
    //do something
})
0

你这样返回的还是promise对象。

0
async function fn1() {
    var promise = new Promise(function(resolve, reject) {
        // ... some code

        if ( /*异步操作成功*/ ) {
            resolve(value); //怎么将这个值作为fn1函数的返回值?
        } else {
            reject(error);
        }
    });

    var value = await promise;
}
0
首先需要确认的是Promise对象的状态不受外界影响,也就是说,Promise对象内部return外部是不能获取到的。

所以我们要想获取Promise内部的值(也就是通过resolve(value)向下then传递的值),可以通过以下方法:

方法一:看一个示例

封装一个分页Promise:pageHelper.js

const db = require('./db')

module.exports.startPage = (currentPage, pageNumber, queryTable) => {
  return new Promise((resolve, reject) => {
    db.query('SELECT COUNT(*) as count FROM ' + queryTable, (err, ret) => {
      resolve(ret[0].count)
    })
  }).then(value => {
    return new Promise((resolve, reject) => {
      db.query('SELECT * FROM ' + queryTable +' limit ?, ?', [currentPage - 1, pageNumber], (err, ret) => {
        resolve({totalPage:value, resultdata: ret})
      })
    })
  })
}

可以在其他模块中这样拿到value:

const express = require('express')
const db = require('../utils/db')
const pageHelper = require('../utils/pageHelper')
const router = express.Router()

router.get('/posts', (req, res, next) => {
  let currentPage = 2
  let pageNumber = 5
  pageHelper.startPage(currentPage, pageNumber, 'ali_article').then(value => {
    res.render('admin/posts.html', {
      pageResult: value
    })
  })
})

方法二:

使用callback回调,只是一种画蛇添足的做法,但能帮助理解Promise对象的特性

function fn1(callback) {
  var promise = new Promise(function (resolve, reject) {
    // ... some code
    let value = 1;
    if (true) {
      resolve(value);
    } else {
      reject(error);
    }
  }).then(value => {
    callback(value)
  });
}

fn1(value => {
  console.log(value)
});
-1
return promise.then(function(value) {
    return value;  //这么写对吗?
})

改为

promise.then(function(value) {
    console.log(value);
      return value;  //这么写对吗?
  })

直接调用fn1即可

0

楼主最后怎么解决的 遇到了同样的问题

该答案已被忽略,原因:无意义的内容:赞、顶、同问等毫无意义的内容

撰写答案

推广链接