如何让子函数的传给父函数

a = function (){
    var o = {}
    son(function(){
        o.x = 1,
        o.y = 2
        return o //??
    })
    return o //??
}

如何让子函数运算完后父函数再返回结果呢?
目前返回的应该是Object {} 我希望得到 Object { x: 1, y: 2 }


本来想简化一下问题,但是看来大家对我简化的问题不太明白,囧~

$.extend($._, {
  get_color: function(pic) {
    d = {}
    RGBaster.colors(pic, {
      success: function(payload) {
        color = payload.secondary[0]
        rgb = color.split(',')
        brightness = (rgb[0] * 30 + rgb[1] * 59 + rgb[2] * 11 + 50) / 255
        brightness < 50 ? d.theme = 'drak' : d.theme = 'light'
        d.bgcolor = 'rgb(' + color + ')'
        console.log(d); //这个结果是我希望返回到get_color中的
      }
    })
  }
}

RGBaster.colors 是一个异步执行的方法

我希望在调用 $._.get_color('img') 时可以返回上方代码中log的结果,然后现在的问题就是怎么把 RGBaster.colors运算后的结果返回到 $._.get_color

阅读 4.9k
4 个回答

1) RGBaster.colors 是一个异步执行的方法,那么也就是这个函数在其函数体内的同步方法调用完毕后,将回到get_color函数体继续向下执行,不会等待异步方法的执行完成
2)你想$._.get_color('img')执行完了后就得到异步执行的结果是不可能的
3)你可以换个实现思路,既然是异步的,那么就等RGBaster.colors执行完了,通知你~~嗯,对的,就是使用回调函数

$.extend($._, {
  get_color: function(pic,resultCallback) {
    d = {}
    RGBaster.colors(pic, {
      success: function(payload) {
        color = payload.secondary[0]
        rgb = color.split(',')
        brightness = (rgb[0] * 30 + rgb[1] * 59 + rgb[2] * 11 + 50) / 255
        brightness < 50 ? d.theme = 'drak' : d.theme = 'light'
        d.bgcolor = 'rgb(' + color + ')'
        
        resultCallback&&resultCallback(d);
      }
    })
  }
}
...
$._.get_color('img',function(d){
    console.log(d); //这个结果是我希望返回到get_color中的
});

4) promise也是可以的~~~

son();
return o;

从你的程序,不知道 son() 干了啥,只知道 son() 需要一个函数作为参数,肯定是在里面调用了这个函数。

由于 o 定义在域中,你传入 son() 的函数里对 o 的属性进行了赋值操作,但是返回的 o 却没有相应的属性,估计 son() 进行了异步操作。也就是说,在执行时间上,先返回了 o,后进行对传入 son() 的函数进行调用。

那么,这就需要用 Promise 来解决了。如果 son() 返回的就是一个 Promise 对象,那直接返回 son() 的结果就好

a = function (){
    var o = {}
    return son(function(){
        o.x = 1;
        o.y = 2;
        return o;
    });
};

不过这种可能性比较小,而且也不知道 son() 返回的 Promise 对象会不会带传入函数的返回值。所以自己用 Promise 来处理好了

var p = new Promise(function(resolve, reject) {
    son(function() {
        resolve({
            x: 1,
            y: 2
        });
    });
});

p.then(function(a) {
    // 你要的结果在这里
    console.log("Here is what you want", a);
});

不过这样仍然有一个问题……那就是 son() 得调用你传入的那个函数,否则永远不会走到 p.then 里面去。

  1. 如果在son里面完成的操作是同步的,则不必在son的函数参数里返回o,直接在执行son之后使用o即可,因为从你的代码来看,son里面的o和son外面的o是对同一个对象的引用。

  2. 如果是异步的,则不行,因为son的执行全部完成的时间点往往在外面的return语句之后,所以这个时候应该用回调。

  3. 写完后,再看一下你的描述,好像我上面答的不是你问的。“目前返回的应该是Object {} 我希望得到 Object { x: 1, y: 2 }”,为什么说是“应该是”,难道你没有运行过你的代码吗(感觉你在推测)?如果son函数不是异步的,返回结果肯定是Object { x: 1, y: 2 };如果是异步的则肯定是 {} 啊。

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