sql >> データベース >  >> NoSQL >> MongoDB

Async、Callbacks、Closure、Oh My

    私がそれを正しく理解しているなら、あなたはこのようなことをしたいと思うでしょう:

    var positions = this.getPositions(function(positions) {
        console.log(positions[0]);
    });
    

    つまり、「getPositions」は、位置が正常にロードされたときに呼び出され、位置配列が渡される単一のコールバックパラメーターを受け入れるように記述します。 getPositionsで 位置がすでにロードされているかどうかを確認し、ロードされている場合は、コールバックを直接呼び出すことができます。それ以外の場合は、コールバックのキューに追加します(例:this.positionsLoadedCallbacks )、すべての位置がロードされた後に反復します(これはloadのどこかにあると思います me.orderPositions()の近くの関数 。

    たとえば、getPositions 関数は次のようになります:

    getPositions : function(callback) {
        if(this.positions !== null) {
            callback(this.positions);
            return;
        } 
    
        this.positionsLoadedCallbacks.push(callback);
    },
    

    位置がロードされたことを確認した後(つまり、loadJSON成功コールバック内)のどこかに、次のようなものを配置する必要があります:

    for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
        this.positionsLoadedCallbacks[i](this.positions);
    }
    

    そして、this.positionsLoadedCallbacksを初期化することを忘れないでください :)

    console.logトリビア

    console.log(positions)が 動作し、console.log(positions[0]) 簡単ではありません。オブジェクト参照をconsole.logに渡す場合 、小さな「展開」矢印をクリックして内部を確認すると、オブジェクトが検査されます。 オブジェクト/配列。もちろん、その矢印をクリックするまでに、位置はロードされています。ただし、特定の配列要素(positions[0]など)を渡す場合 )その値を直接調べて、まだundefinedであることがわかります。 、その結果をコンソールに記録します。

    自分で試してみてください:

    var i = [];
    console.log([i]);
    i.push(123);
    

    前のスニペットはクロム24で、[Array[0]]を示しています コンソールに表示されますが、展開すると、配列がlength: 1であることがわかります。 その最初の要素は123です




    1. RedisSYNCおよびEXEC

    2. phpredisのmulti()呼び出し内の各呼び出しは、redisへの新しいネットワークラウンドトリップになりますか?

    3. arrayFiltersでフィルターされた位置演算子を使用して更新を適用する方法

    4. ユーザー名がdbに存在するかどうかを検証するためにnode.jspromiseを使用しています