2017-11-14 48 views
2

私はAPIに接続する関数を持っています。その関数はPromiseを返します。私はthisコンテキストを含む定数で解決しているときにPromise.resolveがnullを返す理由を理解できません。プロミスはこれを解決する際にnullに解決します

const connect =() => { 
    return new Promise((resolve, reject) => { 
    Gitana.connect(config, function(err) { 
     const platform = this; 
     if (err) { 
     return reject(err); 
     } 
     console.log(platform) // Object that I want 
     resolve(platform) 
    }); 
    }); 
} 

connect() 
    .then(platform => { 
    console.log(platform) // null 
    }) 

それは任意のヘルプであれば、私は知らないが、私は、データストアと呼ばれる解決オブジェクト(プラットフォーム)上のメソッドが存在しているはず。私はその方法を解決した場合、すなわちresolve(platform.datastore)私は方法を取得し、代わりにnull

の私はresolve(25)またはresolve('hello')、静的な値を解決しようとしている、それが正常に動作します。

オブジェクトを返す/解決するにはどうすればよいですか?

+0

をこれは本当に私を困惑:-Dそれは内部のこと「この」参照ということでした ' Gitana.connect'コールバックがガベージコレクションされていますか?最上位レベルの変数 'let platform = {initial:true}'を宣言してから、コールバックの中でそれを 'this'バインディングに代入することができますか?解決の前に 'platform = this'ですか? – Sergeon

+0

@Sergeon残念ながら、まだ残っています – Viktor

+0

最悪の場合、他の解決策が見つからない場合は、 'JSON.parse(JSON.stringify(this)) 'を使ってオブジェクトの深いクローンを作成できます。 – Vasan

答えて

1

あなたが指摘したように、実際に渡そうとしている値が.thenメソッドを持っているため、これが起こっているように見えるので、約束の解決手順に含まれています。

一つの方法は、に沿って、それを輸送するための容器でそれをラップすることです方法を削除せずにそれを渡すために:

const connect =() => { 
    return new Promise((resolve, reject) => { 
    Gitana.connect(config, function(err) { 
     const platform = this; 
     if (err) { 
     return reject(err); 
     } 
     resolve({ platform }); 
    }); 
    }); 
} 

connect() 
    .then(({ platform }) => { 
    console.log(platform) 
    }) 
0

解決するオブジェクトであるplatformにもthenメソッドがあります。元の約束を新しい約束で解決すれば、新しい約束を解決しようとします。この場合、新しい約束はnullに解決されます。

const connect =() => { 
    return new Promise((resolve, reject) => { 
    Gitana.connect(config, function(err) { 
     const platform = this; 
     if (err) { 
     return reject(err); 
     } 
     delete platform.this; 
     resolve(platform); 
    }); 
    }); 
} 

次の質問は、すべて時代遅れthen方法を削除するよりも良い方法でこれを行う方法です。

+1

なぜ 'then'メソッドが含まれているのかご存じですか?このオブジェクトに関するAPIドキュメントはありますか? – JLRishe

関連する問題