javascript - 如何让子函数的传给父函数
大家讲道理
大家讲道理 2017-04-10 16:43:06
[JavaScript讨论组]
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)
伊谢尔伦

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 };如果是异步的则肯定是 {} 啊。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号