Skip to content

Commit

Permalink
Fix promises on iOS to no longer wrap values in Arrays
Browse files Browse the repository at this point in the history
Summary:
public
In facebook@9baff8f#diff-8d9841e5b53fd6c9cf3a7f431827e319R331, I incorrectly assumed that iOS was wrapping promises in an extra Array.  What was really happening is that all the callers were doing this.  I removed the wrapping in the callers and the special case handling MessageQueue.

Now one can pass whatever object one wants to resolve and it will show properly in the resolve call on the js side.  This fixes issue facebook#5851

Reviewed By: nicklockwood

Differential Revision: D2921565

fb-gh-sync-id: 9f81e2a87f6a48e9197413b843e452db345a7ff9
shipit-source-id: 9f81e2a87f6a48e9197413b843e452db345a7ff9
  • Loading branch information
Dave Miller authored and christopherdro committed Feb 12, 2016
1 parent dc08de4 commit 2a3e86a
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 15 deletions.
10 changes: 5 additions & 5 deletions Libraries/CameraRoll/RCTCameraRollManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ @implementation RCTCameraRollManager
RCTLogWarn(@"Error saving cropped image: %@", saveError);
reject(RCTErrorUnableToSave, nil, saveError);
} else {
resolve(@[assetURL.absoluteString]);
resolve(assetURL.absoluteString);
}
}];
});
Expand All @@ -110,22 +110,22 @@ static void RCTResolvePromise(RCTPromiseResolveBlock resolve,
BOOL hasNextPage)
{
if (!assets.count) {
resolve(@[@{
resolve(@{
@"edges": assets,
@"page_info": @{
@"has_next_page": @NO,
}
}]);
});
return;
}
resolve(@[@{
resolve(@{
@"edges": assets,
@"page_info": @{
@"start_cursor": assets[0][@"node"][@"image"][@"uri"],
@"end_cursor": assets[assets.count - 1][@"node"][@"image"][@"uri"],
@"has_next_page": @(hasNextPage),
}
}]);
});
}

RCT_EXPORT_METHOD(getPhotos:(NSDictionary *)params
Expand Down
6 changes: 3 additions & 3 deletions Libraries/LinkingIOS/RCTLinkingManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ - (void)handleOpenURLNotification:(NSNotification *)notification
// TODO: we should really report success/failure via the promise here
// Doesn't really matter what thread we call this on since it exits the app
[RCTSharedApplication() openURL:URL];
resolve(@[@YES]);
resolve(@YES);
}

RCT_EXPORT_METHOD(canOpenURL:(NSURL *)URL
Expand All @@ -90,13 +90,13 @@ - (void)handleOpenURLNotification:(NSNotification *)notification
if (RCTRunningInAppExtension()) {
// Technically Today widgets can open urls, but supporting that would require
// a reference to the NSExtensionContext
resolve(@[@NO]);
resolve(@NO);
return;
}

// This can be expensive, so we deliberately don't call on main thread
BOOL canOpen = [RCTSharedApplication() canOpenURL:URL];
resolve(@[@(canOpen)]);
resolve(@(canOpen));
}

@end
6 changes: 1 addition & 5 deletions Libraries/Utilities/MessageQueue.js
Original file line number Diff line number Diff line change
Expand Up @@ -324,11 +324,7 @@ class MessageQueue {
method,
args,
(data) => {
// iOS always wraps the data in an Array regardless of what the
// shape of the data so we strip it out
// Android sends the data back properly
// TODO: Remove this once iOS has support for Promises natively (t9774697)
resolve(Platform.OS == 'ios' ? data[0] : data);
resolve(data);
},
(errorData) => {
var error = createErrorFromErrorData(errorData);
Expand Down
2 changes: 1 addition & 1 deletion React/Modules/RCTClipboard.m
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ - (dispatch_queue_t)methodQueue
rejecter:(__unused RCTPromiseRejectBlock)reject)
{
UIPasteboard *clipboard = [UIPasteboard generalPasteboard];
resolve(@[RCTNullIfNil(clipboard.string)]);
resolve(RCTNullIfNil(clipboard.string));
}

@end
2 changes: 1 addition & 1 deletion React/Modules/RCTSourceCode.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ - (void)setScriptText:(NSString *)scriptText {}
if (RCT_DEV && self.scriptData && self.scriptURL) {
NSString *scriptText = [[NSString alloc] initWithData:self.scriptData encoding:NSUTF8StringEncoding];

resolve(@[@{@"text": scriptText, @"url": self.scriptURL.absoluteString}]);
resolve(@{@"text": scriptText, @"url": self.scriptURL.absoluteString});
} else {
reject(RCTErrorUnavailable, nil, RCTErrorWithMessage(@"Source code is not available"));
}
Expand Down

0 comments on commit 2a3e86a

Please sign in to comment.