V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
haozhang
V2EX  ›  JavaScript

在 js 中使用回调如何保证数据的同步获得。

  •  1
     
  •   haozhang · 2015-06-11 20:39:27 +08:00 · 3058 次点击
    这是一个创建于 3451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不太会表达。我还是直接贴代码
    ```javascript
    var results = "";

    request({
    method: "GET"
    url: "www.xxx.com"
    }, function (data) {
    results = data;
    });

    console.log(results) // 这里因为回调的原因总是空的。
    ```
    有什么方法保证回调之后数据能同步...

    13 条回复    2015-06-14 15:34:23 +08:00
    Phariel
        1
    Phariel  
       2015-06-11 20:49:37 +08:00
    sync or promise
    yangxiongguo
        2
    yangxiongguo  
       2015-06-11 20:49:53 +08:00
    最暴力的方法 async:false
    clink8001
        3
    clink8001  
       2015-06-11 20:54:58 +08:00
    var XmlHttp;
    XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");

    function send() {
    XmlHttp.onreadystatechange = doHttpReadyStateChange;
    XmlHttp.open("GET", "http://localhost/sample.xml", true);
    XmlHttp.send();
    }

    function doHttpReadyStateChange() {
    if (XmlHttp.readyState == 4) {
    alert("Done");
    }
    }

    楼主,当 XmlHttp.readyState 的值为4的时候,数据才会返回。你直接调用有可能数据还没返回。
    yushiro
        4
    yushiro  
       2015-06-11 21:13:27 +08:00 via iPhone
    把后续代码写在ajax的success的callback里面啊,就不会有问题了。
    sarices
        5
    sarices  
       2015-06-11 21:39:46 +08:00
    1 改成同步
    2 把console.log放到callback里面
    learnshare
        6
    learnshare  
       2015-06-11 21:39:54 +08:00
    console.log(results) 应该放在这里:

    }, function (data) {
    results = data;
    ****console.log(results);
    });
    lixia625
        7
    lixia625  
       2015-06-11 21:50:00 +08:00 via Android
    Promise
    guchengf
        8
    guchengf  
       2015-06-11 22:09:49 +08:00
    你都说了是“回调”了,人家还没回,你就调了
    shangjiyu
        9
    shangjiyu  
       2015-06-11 22:25:33 +08:00
    @guchengf +1 呵呵
    w88975
        10
    w88975  
       2015-06-11 23:42:53 +08:00
    但凡异步的都必须在回调里做操作
    haozhang
        11
    haozhang  
    OP
       2015-06-12 01:23:51 +08:00
    本来是在写爬虫遇到的问题,大致抽象了出来,我全用async解决了,感谢以上各位的回复🙏。
    holulu
        12
    holulu  
       2015-06-12 07:55:22 +08:00
    ES 6 的 generator ,局部的同步代码
    mingyun
        13
    mingyun  
       2015-06-14 15:34:23 +08:00
    @guchengf 哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:07 · PVG 19:07 · LAX 03:07 · JFK 06:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.