1

以下のプログラム構造を意図したとおりに動作させる方法について少し質問があります。

コンソールが正しい順序で数字を出力するように実行したい。現在実行すると、コンソールが 1 2 3 ではなく 1 3 2 でログアウトするような方法でメソッドが実行されるように実行されます。

これは、javascript が関数呼び出しを処理する方法の誤解によるものだと推測しています。

コーヒー:

class exports.Class
    constructor: (@options) ->
    onEdit: =>
        @secondFunction()
        console.log "3"

    secondFunction: =>
        console.log "1"
        @externalClass.getData( (callback) =>
            console.log "2"
        ) 

JS:

var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

exports.Class = (function() {

  function Class(options) {
    this.options = options;
    this.secondFunction = __bind(this.secondFunction, this);

    this.onEdit = __bind(this.onEdit, this);

  }

  Class.prototype.onEdit = function() {
    this.secondFunction();
    return console.log("3");
  };

  Class.prototype.secondFunction = function() {
    var _this = this;
    console.log("1");
    return this.externalClass.getData(function(callback) {
      return console.log("2");
    });
  };

  return Class;

})();
4

1 に答える 1

2

何が起こっているかというと、onEdit() を呼び出すと、すぐに (そして同期的に) secondFunction() が呼び出されます。同期的に呼び出された secondFunction は、すぐに "1" を出力し、データを取得するための呼び出しを行います。コールバックは後で呼び出されます。実行のためにキューに入れられたと想像できます。一方、secondFunction は終了し、実行を onEdit に戻し、最後の行は "3" を出力します。

「2」がいつ表示されるかを制御することはできません。1 ミリ秒後または 30 秒後です。

非同期環境でワークフローを調整するのに役立つhttps://github.com/caolan/asyncのようなライブラリがあります。Async JavaScript http://www.amazon.com/Async-JavaScript-ebook/dp/B007N81FE2という書籍を参照して、この種の環境での作業方法をよく理解してください。

このようにコードを書き直して目的の効果を得ることができますが、これは実際のコードでは簡単ではないかもしれませんが、アイデアです:

class exports.Class
    constructor: (@options) ->
    onEdit: =>
        @secondFunction()

    secondFunction: =>
        console.log "1"
        @externalClass.getData( (callback) =>
            console.log "2"
            @lastStep()
        ) 

    lastStep: =>
        console.log "3"
于 2012-12-10T15:58:47.507 に答える