一个内部带有promise的函数foo,如何写才能让这个foo函数变成同步

最终要解决的问题是,我有一个方法foo,这个函数的内部需要调用一个promise来处理我的数据,这个foo函数的返回值就是promise的then能拿到的值。

伪代码如下:

var p = new Promise((resolve, reject) => {
    setTimeout(function() {
        resolve(5)
    }, 1000)
})

function foo() {
    p.then((data) => {
        // foo函数要返回这个data
    })

    return '...' // 返回的是p的then方法中接收到的data
}

// 此处应该输出5
console.log(foo())
  1. node版本不能超过v6.10.0,async/await没戏。
  2. 如果是直接返回promise的话,后边牵扯到的代码太多了,还要牵扯到多人协作,暂不考虑。

还能有其他的方法吗? 我感到很绝望。

阅读 4.6k
7 个回答

想方便的话可以直接用co模块 专门把promise转换成同步的
npm co

或者自己封装
co源码去掉注释不到100行
我之前写过一个简单的dome

//模拟co
function co(gen) {
    var gen = gen();
    var a = gen.next();
    a.value.then(function (res) {
        gen.next(res);
    })
}
//调用
co(function* () {
    //模仿异步 延时三秒
    var result = yield new Promise(function (resolve, reject) {
        setTimeout(function () {
            return resolve("我是异步但是同步执行");
        }, 3000)
    })
    console.log(result);//三秒后输出 "我是异步但是同步执行"
})

不用promise么,介意callback么?

function foo(callback) {
    p.then((data) => {
        // foo函数要返回这个data
        callback(data);
    })

    //return '...' // 返回的是p的then方法中接收到的data
}

foo(function(result){
    console.log(result);
})

我也曾今试图解决这个问题,然而好像并没有解决办法

  1. 你可以使用 async 模块,或者用 bable 转换,来支持 async/await

  2. async function 返回值是 Promise,它只是一个语法糖;

  3. 我替你感到绝望。

只能是这样:

function foo(f) {
    p.then(f)
}

// 此处应该输出5
foo(console.log)

试着习惯函数式、异步带来的非人类写法吧。

没有办法实现,既然是异步操作,就必须按照异步的编程方式来做,建议早点重构,你现在的这个需求是无解的,这一点是确定的。

初衷就是错的
你这个函数本身就是个异步的调用,你非得告诉别人是同步的,可能吗?

要不你内部别用 promise 来处理,用个同步库

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