js promise怎么返回值?

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不行,使用回调函数怎么能实现?

阅读 79.6k
9 个回答

下面的方法可以获取 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);
};

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

promise 不能返回值

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

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

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

    var value = await promise;
}

直接改成:

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

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

接着就可以:

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

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

首先需要确认的是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)
});
新手上路,请多包涵
function fn1() {
    var promise = new Promise(function(resolve, reject) {
        // ... some code

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

    return promise.then(function(value) {
        return new Promise(function(resolve,reject){
            resolve value;
        })
    })
}
return promise.then(function(value) {
    return value;  //这么写对吗?
})

改为

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

直接调用fn1即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏